#pragma once

#include <iostream>
#include <fstream>
#include <string>

class Util
{
public:
    static bool ReadFileContent(const std::string &filename, std::string *out)
    {
        // version 1
        // 1 直接读取，打开文件
        //     std::ifstream in(filename);
        //     if (!in.is_open())
        //     {
        //         return false;
        //     }
        //     // 2 把所有内容当做 数据内容 直接读入
        //     std::string line;
        //     while (std::getline(in, line))
        //     {
        //         *out += line;
        //     }
        //     in.close();
        //     return true;

        // version 2
        // 直接 二进制 读入， 因为 像图片那样的无法像正常数据内容 读取，

        //任何 流都可以看做一个数组，二进制也是一个数组
        //先找到 数组 大小 ----  目的 开辟 out存储二进制所需要的空间
        int filesize = FileSize(filename);
        if(filesize > 0)
        {
            std::ifstream in(filename);
            if(!in.is_open())
            return -1;
            out->resize(filesize);
            //注意这里是 二进制读取---一个一个读，要注意转化
            in.read((char*)(out->c_str()), filesize);
            in.close();
        }
        else{
            return false;
        }
        return true;
    }

    static int FileSize(std::string &filename)
    {
        std::ifstream in(filename, std::ios::binary);
        if(!in.is_open())
        return -1;

        in.seekg(0, in.end);
        int filesize = in.tellg();
        in.seekg(0, in.beg);
        in.close();
        return filesize;
    }

    static bool ReadOneLine(std::string &bigstr, std::string *out, const std::string &sep /*\r\n*/)
    {
        // 先找到终点
        auto pos = bigstr.find(sep);
        if (pos == std::string::npos)
        {
            return false;
        }
        // 在想 目标流 添加第一行内容
        *out += bigstr.substr(0, pos);
        // 删除整体内容的第一行 + sep
        bigstr.erase(0, pos + sep.size());
        return true;
    }
};